package com.nehc.nettyserver.common.model;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/**
 * 客户端信息实体类
 * 
 * @author NEHC
 */
@Data
@NoArgsConstructor
public class ClientInfo {
    /**
     * 客户端ID
     */
    private String clientId;
    
    /**
     * 用户ID
     */
    private String userId;
    
    /**
     * IP地址
     */
    private String ipAddress;
    
    /**
     * 连接时间
     */
    private long connectTime;
    
    /**
     * 断开时间
     */
    private Long disconnectTime;
    
    /**
     * 断开原因
     */
    private String disconnectReason;
    
    /**
     * 最后活动时间
     */
    private long lastActiveTime;
    
    /**
     * 客户端类型
     */
    private String clientType;
    
    /**
     * 客户端版本
     */
    private String clientVersion;
    
    /**
     * 位置信息
     */
    private String location;
    
    /**
     * 设备信息
     */
    private String deviceInfo;
    
    /**
     * 连接状态
     */
    private String status = "CONNECTED";
    
    /**
     * 额外信息
     */
    private Map<String, Object> attributes = new HashMap<>();
    
    /**
     * 添加属性
     */
    public void addAttribute(String key, Object value) {
        if (attributes == null) {
            attributes = new HashMap<>();
        }
        attributes.put(key, value);
    }
    
    /**
     * 获取属性
     */
    public Object getAttribute(String key) {
        return attributes != null ? attributes.get(key) : null;
    }
    
    /**
     * 是否已认证
     */
    public boolean isAuthorized() {
        return userId != null && !userId.isEmpty();
    }
    
    /**
     * 是否已断开连接
     */
    public boolean isDisconnected() {
        return disconnectTime != null && disconnectTime > 0;
    }
    
    /**
     * 获取连接持续时间（毫秒）
     */
    public long getDuration() {
        if (disconnectTime != null && disconnectTime > 0) {
            return disconnectTime - connectTime;
        } else {
            return System.currentTimeMillis() - connectTime;
        }
    }
    
    /**
     * 更新最后活动时间
     */
    public void updateLastActiveTime() {
        this.lastActiveTime = System.currentTimeMillis();
    }
} 